<?php
/**
* API Service ZipCode => Return address
* Author: Hung
*/
defined('_JEXEC') or die;
define('REQUEST_URL','http://zip.cgis.biz/xml/zip.php');
define('STR_CODE','utf-8');
class ZipSearch{
    // 郵便番号検索時の入力値をチェックする
    function CheckValueZIP($zip,$ver=0) {
    	
    	$err = ''; // 入力値に誤りがある場合、メッセージを格納する
    	
    	if($zip == '') {
    		$err .= '郵便番号が未入力です。<br>';
    	}
    	else {
    	
    		// ver=0 で現行郵便番号形式のチェック
    		// ver=1 で旧郵便番号形式のチェック
    		if($ver == 0) {
    			
    			if(!preg_match('/^[0-9]{7}$/',$zip)) {
    				$err .= '郵便番号の形式に誤りがあります。<br>';
    			}
    		}
    		elseif($ver == 1) {
    			if(!preg_match('/^[0-9]{3}$/',$zip) && !preg_match('/^[0-9]{5}$/',$zip)) {
    				$err .= '郵便番号の形式に誤りがあります。<br>';
    			}
    		}
    	}
    	return $err;
    }

    function GetAddress($zip,$ver=0) {

    	// アクセスするURL作成
    	$url = REQUEST_URL.'?zn='.$zip;
        
    	if($ver == 1) {
    		$url .= '&ver=1';
    	}
    	
    	// XML処理 // 初めて使うがいまいちわからん...
    	$GLOBALS['xml']['ADDRESS_value'] = array();
    	$GLOBALS['xml']['values'] = array(); // 住所情報格納用
    	$GLOBALS['xml']['result'] = array(); // その他情報格納用
    	function startElement($parser, $name, $attrs) {
    		
    		// $name  は要素名
    		// $attrs は属性名をキーとした連想配列
    		
    		if($name == 'ADDRESS_value') {
    			$GLOBALS['xml']['ADDRESS_value'][] = $attrs;
    		}
    		elseif($name == 'value') {
    			// ADDRESS_value出現ごとにカウントアップしつつ、住所情報を格納
    			// 0 からスタートしたいので -1 する。
    			$i = count($GLOBALS['xml']['ADDRESS_value']) - 1;
    			foreach($attrs as $key=>$val) {
    				$GLOBALS['xml']['values'][$i][$key] = $val;
    				break;
    			}
    		}
    		elseif($name == 'result') {
    			foreach($attrs as $key=>$val) {
    				$GLOBALS['xml']['result'][$key] = $val;
    				break;
    			}
    		}
    	}
    
    	function endElement($parser, $name) {
    		// なにもしない
    	}
    
    	$xml_parser = xml_parser_create();
    	xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
    	xml_set_element_handler($xml_parser, "startElement", "endElement");
    	if (!($fp = fopen($url,"r"))) {
    		die('Error: Internet no direct access, could not open XML');
    	}
    	while ($data = fread($fp, 4096)) {
    		
    		// 文字コード変換
    		$data = mb_convert_encoding($data,STR_CODE,'utf-8');
    		
    		if (!xml_parse($xml_parser, $data, feof($fp))) {
    			die(sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));
    		}
    
    	}
    	xml_parser_free($xml_parser);
    	
    	$result = $GLOBALS['xml'];
    	unset($GLOBALS['xml']);
    	
    	// result_code 正常=>1 異常=>0
    	if($result['result']['result_code'] == 0) {
    		die('Application Error: code '.$result['result']['error_code'].' / message '.$result['result']['error_note']);
    	}
    	
    	return $result;
    }
    
    // 住所データを１つにする
    function ChangeSingle($result_values) {
    	if(count($result_values)) {
    		foreach($result_values as $value) {
    			$result_values_single = $value;
    			break;
    		}
    		return $result_values_single;
    	}
    	else {
    		return false;
    	}
    }
}
?>